package controller;

import org.newdawn.slick.SlickException;

import model.*;


public final class MisterJumpController 
{
	
	Wrapper model = Wrapper.getInstance();
	
	private boolean rightKeyPressed = false;
	private boolean leftKeyPressed = false;
	private boolean ready2shoot = true;
	private boolean shoot = false;
	private double shotAngle;
	
	private double ax = 0.001; // TODO brauchbaren Wert rausfinden, wie bei ↓
	private double ay = 0.0005; // TODO entspricht der Fallbeschleunigung, durch ausprobieren muss ein guter Wert gefunden werden
	
	
	public MisterJumpController() 
	{
		// TODO Auto-generated constructor stub
	}
	
	public void rightKeyPressed(boolean rightkey)
	{
		this.rightKeyPressed = rightkey;
	}
	
	public void leftKeyPressed(boolean leftkey)
	{
		this.leftKeyPressed = leftkey;
	}
	
	public void shoot(double angle)
	{
		this.shoot = true;
		this.shotAngle = angle;
	}
	
	public void newgame()
	{
		// TODO
	}
	
	private void resetKeys()
	{
		this.rightKeyPressed = false;
		this.leftKeyPressed = false;
		this.shoot = false;
	}
	
	public static boolean collisionDetected(double x1, double y1, double width1, double height1, double x2, double y2, double width2, double height2)
	{
		if (x1 + width1 < x2) return false;
		if (y1 + height1 < y2) return false;
		if (x2 + width2 < x1) return false;
		if (y2 + height2 < y1) return false;
		return true;
	}
	
	
	public void act()
	{
		
		if (shoot && ready2shoot)
		{
			ready2shoot = false;
			try
			{
				model.schiessen(model.getMisterX() + model.getMisterWidth()/2, model.getMisterY() + model.getMisterHeight(), shotAngle);
			}
			catch (SlickException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (!shoot)
		{
			ready2shoot = true;
		}
		
		// Y-Geschwindigkeit verringern wegen Gravitation
		model.setMisterYGeschwindigkeit(model.getMisterYGeschwindigkeit() - ay);
		
		// Rechts-Links-Bewegung berechnen + speichern
		if (!rightKeyPressed && !leftKeyPressed)
		{
			model.setMisterXGeschwindigkeit(0);
		}
		if (rightKeyPressed)
		{
			model.setMisterXGeschwindigkeit(model.getMisterXGeschwindigkeit() + ax);
		}
		if (leftKeyPressed)
		{
			model.setMisterXGeschwindigkeit(model.getMisterXGeschwindigkeit() - ax);
		}
		
		// Items agieren
		Item[] things = model.holeSichtfenster();
		for (int i = 0; i < things.length; i++)
		{
			things[i].act();
		}
		
		// Y-Bewegung umsetzen, falls notwendig Sichtfenster nach oben schieben
		model.setMisterY(model.getMisterY() + model.getMisterYGeschwindigkeit());
		
		if (model.getMisterY() + model.getMisterHeight() > 0.6 )
		{
			model.schiebeSichtfenster(model.getMisterY() + model.getMisterHeight() - 0.6); 
			//model.setMisterY(0.5 - model.getMisterHeight());
			//TODO funktioniert nicht so, wie es sollte; v.a. im Model sind noch Änderungen notwendig
		}
		
		// X-Bewegung umsetzen, falls notwendig, Mister auf die andere Bildschirmseite Beamen 
		model.setMisterX(model.getMisterX() + model.getMisterXGeschwindigkeit());
		
		if (model.getMisterX() + model.getMisterWidth()/2 > 1.0)
		{
			model.setMisterX(-model.getMisterWidth()/2 + 0.001);
		}
		else if (model.getMisterX() + model.getMisterWidth()/2 < 0)
		{
			model.setMisterX(1.001 - model.getMisterWidth()/2);
		}
		
		resetKeys();
		
	}

} //Class


